using System;

namespace Fornax020.SerialComm.Core
{
    /// <summary>
    /// 串口命令基类 - 命令模式的核心
    /// 命令模式：将请求封装为对象，使你可以用不同的请求、队列或日志请求来参数化其他对象
    /// </summary>
    public abstract class CommandBase
    {
        /// <summary>
        /// 命令名称
        /// </summary>
        public string Name { get; protected set; }

        /// <summary>
        /// 命令描述
        /// </summary>
        public string Description { get; protected set; }

        /// <summary>
        /// 获取命令数据
        /// </summary>
        /// <returns>命令字节数组</returns>
        public abstract byte[] GetCommandData();

        /// <summary>
        /// 执行命令
        /// </summary>
        /// <param name="serialManager">串口管理器</param>
        /// <returns>执行是否成功</returns>
        public virtual bool Execute(SerialManager serialManager)
        {
            if (serialManager == null)
            {
                return false;
            }

            byte[] commandData = GetCommandData();
            System.Diagnostics.Debug.WriteLine($"[CommandBase] 执行命令: {Name}, 数据: {BitConverter.ToString(commandData)}");
            bool result = serialManager.SendData(commandData);
            System.Diagnostics.Debug.WriteLine($"[CommandBase] 命令执行结果: {result}");
            return result;
        }

        /// <summary>
        /// 获取命令的字符串表示
        /// </summary>
        /// <returns>命令字符串</returns>
        public override string ToString()
        {
            return $"{Name}: {Description}";
        }
    }
}
